SQlite源码分析

执行前的准备

         该功能由函数void sqlite3VdbeMakeReady( Vdbe p, Parse pParse ){}实现。
         在创建虚拟机后,需要为第一次执行准备一个虚拟机。其中涉及到例如分配栈空间和初始化程序计数器等操作。在VDBE准备好后,可以被一个或多个sqlite3VdbeExec()函数调用执行。 这个函数就是用来准备一个虚拟机的,它可能被每一个虚拟机精确调用一次。在程序被调用之后,VM被“打包”,准备好用来运行。程序被调用后,禁止进一步调用sqlite3VdbeAddOp()功能。该程序将VDBE从解析对象断开来帮助生成它,以便VDBE成为一个独立的实体并且解析对象能够被销毁。对每一个需要的游标也分配一个存储单元,存储单元(nMem+1-nCursor)..nMem不会被 vdbe程序使用,他们被用来为VdbeCursor/BtCursor结构分配空间。内存寄存器,参数寄存器,指针寄存器等使用两种途径分配空间。第一种途径, 我们试图重用在操作码数组结束时的闲置空间。如果我们无法通过重用操作码数组尾部满足所有的存储要求,那么就使用第二种途径,使用新的分配来填满余下的部分。这两种途径可以重用操作码数组尾部剩余空间的的尽可能多的内存,能够显著地减少已就绪的声明所占用的内存数。 同时,该函数还与初始化vdbe函数密切相关。在vdbe执行完毕后,使用sqlite3VdbeRewind()程序来将虚拟机恢复到初始状态。